2008/01/31

Recent entries from same category

  1. そうですか、APIは出てるんですか、じゃあこれでアプリケーションが作れるって事ですか、じゃぁ作って見ましょう。
  2. MixiAPI.pyを密かに画像アップロードに対応してみる
  3. mixiの足跡APIをC++、libxml2、libcurlを使ってプログラミングすると、どんなに長いソースになるかを実証する
  4. mixi API Service用ライブラリをCPython用に作ってみました。
  5. mixiがAPI公開を渋っている訳

既に記事タイトルに効力がなくなってます...汗

昨日は、C++でmixiの足跡APIを叩いてみましたが今日はpythonと行きましょう。
ただ、そのままpythonライブラリ...というのも面白くないので、本日リリースされたIronPython2.0アルファ2に合わせて、IronPythonでやってみようと思います。
基本的には、もうVisual Basic.NETです。pythonらしきソースが無くなってます。

処理は、昨日のC++版と大して変わりません。Atom/WSSE認証を使ってルートエントリからサービスを、またサービスから足跡エントリを取得しています。
やっぱり既存のライブラリがあると無いではソースの量に差が出ますね。
やっぱりAtomPP/WSSEなんかやめちゃえ...
#またまた適当クオリティで申し訳ないです

import clr
clr.AddReferenceByPartialName("System.Xml")
clr.AddReferenceByPartialName("IronPython")
import sys
import System

class MixiService:
    def __init__(self, username, password):
        self.username = username
        self.password = password

    def get_content(self, url):
        webreq = System.Net.WebRequest.Create(url)
        sha = System.Security.Cryptography.SHA1CryptoServiceProvider()
        tim = System.DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ssZ")
        nonce = "xxxxxxxxxxxxxxxxxxxx"
        pwd_bytes = System.Text.Encoding.UTF8.GetBytes(nonce + tim + self.password)
        nonce_bytes = System.Text.Encoding.ASCII.GetBytes(nonce)
        pwd_base64 = System.Convert.ToBase64String(sha.ComputeHash(pwd_bytes))
        nonce_base64 = System.Convert.ToBase64String(nonce_bytes)
        auth = "UsernameToken Username=\"" + self.username \
            + "\", PasswordDigest=\"" + pwd_base64 \
            + "\", Nonce=\"" + nonce_base64 \
            + "\", Created=\"" + tim + "\""

        webreq.Headers.Add("X-WSSE", auth)
        stream = webreq.GetResponse().GetResponseStream()
        return System.IO.StreamReader(stream, System.Text.Encoding.UTF8)

def query_xml(reader, xpath, ns):
    xmlreader = System.Xml.XmlTextReader(reader)
    doc = System.Xml.XmlDocument()
    doc.Load(xmlreader)
    if ns:
        nsmanager = System.Xml.XmlNamespaceManager(doc.NameTable)
        nsmanager.AddNamespace(ns["name"], ns["uri"])
        node = doc.SelectSingleNode(xpath, nsmanager)
    else:
        node = doc.SelectSingleNode(xpath)
    return node.Value

def dump_data(reader):
    xmlreader = System.Xml.XmlTextReader(reader)
    doc = System.Xml.XmlDocument()
    doc.Load(xmlreader)
    nsmanager = System.Xml.XmlNamespaceManager(doc.NameTable)
    nsmanager.AddNamespace("Atom", "http://www.w3.org/2005/Atom")
    list = doc.SelectNodes("/Atom:feed/Atom:entry", nsmanager)
    for node in list:
        print(node.SelectSingleNode("Atom:title", nsmanager).InnerText)
        print(node.SelectSingleNode("Atom:updated", nsmanager).InnerText)
        print(node.SelectSingleNode("Atom:link/@href", nsmanager).Value)
        print

if __name__ == '__main__':
    if len(sys.argv) < 2: sys.exit()
    service = MixiService(sys.argv[1], sys.argv[2])

    # get footstamp service
    data = service.get_content("http://mixi.jp/atom/tracks")
    ns = {"name": "app", "uri": "http://purl.org/atom/app#"}
    value = query_xml(data, "//app:service/app:workspace/app:collection/@href", ns)

    # get footstamp data
    data = service.get_content(value)
    dump_data(data)
Posted at by